Please Check My Modifications - #3
Open
sprlightning wants to merge 51 commits into
Open
Conversation
…mon file for ldac & ldacbt)
…s common file for ldac & ldacbt)
…s only for ldac, works not bad)
…der.c(it is only for ldacbt, based on O2C14's libldac-dec, it works perfect)
…ASK_STACK_SIZE is not defined
… a old lid, 不如O2C14的libldac-dec
remove anonymix007's libldacdec remove sprlightning's liblhdcv5dec add WillyBilly06's LHDC-V5-Decoder remove lhdc constants alter integration of lhdcv5 remove libldacdec's a2dp_vendor_ldac_decoder.c update CmakeLists.txt of bt update Readme of external
## 功能背景 - 用户项目(a2dp_sink_cfint_idf514)需要支持 AVRCP Cover Art(蓝牙封面) - 本框架(v5.1.4 cfint 多 codec 版)此前不支持;esp-idf v5.4.3 起官方支持 - 从 WillyBilly06 的 v6.1.0(与 v5.1.4 同源,btc_av.c 仅 9 行差异)移植 coverart 功能集 ## 移植内容(按依赖链 coverart→GOEP→OBEX) ### 新增组件 - stack/goep/:GOEPC(GOEP 客户端)3 文件,coverart 的 OBEX 传输层 - stack/obex/:OBEX 协议栈 4 文件 + include(L2CAP/RFCOMM 双传输) - bta/av/bta_av_ca_act.c:cover art 客户端动作处理(状态机动作 + GOEP 回调) - bta/av/bta_av_ca_sm.c:cover art 状态机(INIT/OPENING/CONNECTING/CONNECTED/GETTING/CLOSING) - stack 头文件:goepc_api.h / goep_common.h / obex_api.h ### 接线修改 - bta_av_int.h:CA 事件枚举、BTA_AV_CA_*_EVT、tBTA_AV_RCB 新增 cover_art_* 6 字段、 tBTA_AV_DATA union 新增 6 个 CA 成员、CA 状态机函数声明 - bta_av_api.h:BTA_AV_FEAT_COVER_ART(0x1000)、BTA_AV_CA_*_EVT(26/27)、 tBTA_AV_CA_STATUS/DATA 结构、BTA_AvCaOpen/Close/Get API、BTA_AV_CA_IMG_HDL_LEN - bta_av_act.c:SDP 解析 peer cover art feature + OBEX L2CAP PSM 提取、 rc_disc_done 存储 cover_art_l2cap_psm、rc_closed/del_rc 重置 CA 状态 - bta_av_main.c:CA 状态机事件分发(BTA_AV_CA_FIRST/LAST_SM_EVT) - bta_av_api.c:BTA_AvCaOpen/Close/Get 实现(投递 CA 事件到 BTA 任务) - esp_avrc_api.h:CT 事件枚举 +8/+9(STATE/DATA)、MD_ATTR_COVER_ART(0x80)、 FEAT_FLAG_TG_COVER_ART、CA_IMAGE_HANDLE_LEN/MTU 宏、cover_art_state/data 回调参数、 5 个 esp_avrc_ct_cover_art_* API 声明 - esp_avrc_api.c:5 个 API 实现(投递 BTC 事件,GET_IMAGE 用 deep_copy/free) - btc_avrc.h:BTC_AVRC_CT_API_COVER_ART_*_EVT 枚举、ca_conn/get_img 结构、 btc_avrc_args_t union 新增 4 个 CA 成员、rc_cover_art_connected 字段、 btc_avrc_ct_check_cover_art_support 声明 - btc_avrc.c:check_cover_art_support、CT deep_copy/free(GET_IMAGE descriptor)、 rc 断开时上报 CA DISCONNECTED、BTA_AV_CA_STATUS/DATA_EVT 分发到应用、 5 个静态处理函数 + call handler 分发 - avrc_sdp.c:AVRC 版本 1.5→1.6(CA 启用时)、SDP 声明 CT cover art 能力位、 avrc_proto_list 支持 1.6 - avrc_api.h:AVRC_SUPF_CT_COVER_ART_GIP/GI/GLT、AVRC_SUPF_TG_COVER_ART - avrc_defs.h:AVRC_REV_1_6(0x0106) - sdp_api.c/h:新增 SDP_FindProtocolListElem(v6.1.0 API,v5.1.4 缺失) ### 配置宏 - bluedroid_user_config.h:UC_BT_AVRCP_ENABLED(随 A2DP 自动启用)、 UC_BT_AVRCP_CT_COVER_ART_ENABLED(默认开)、UC_BT_GOEPC_ENABLED - bt_target.h:BTA_AV_CA_INCLUDED/BTC_AV_CA_INCLUDED/AVRC_CA_INCLUDED、 GOEPC_INCLUDED、GOEPC_MAX_CONNECTION、OBEX_MAX_CONNECTION/MAX_SERVER - dyn_mem.h:OBEX_DYNAMIC_MEMORY/GOEP_DYNAMIC_MEMORY 默认 FALSE - bt_trace.h:OBEX/OBEX_TL_L2CAP/OBEX_TL_RFCOMM/GOEPC 全套 trace 宏(有日志+无日志版) - CMakeLists.txt:goep/obex/ca_act/ca_sm 源文件 + include 目录 ## 验证 - 项目(a2dp_sink_cfint_idf514)增量编译通过(bt 组件含全部新文件) - 编译产物正常(0x37fa10 bytes,65% 分区余量)
## 例程移植 - examples/bluetooth/bluedroid/classic_bt/avrcp_ct_cover_art/: 完整例程(main.c + bt_app_av.c + pytest + README),从 v6.1.0 原样移植 - examples/bluetooth/bluedroid/classic_bt/common/:8 个公共组件 (bt_app_core_utils/bredr_app_common_utils/a2dp_sink_*_utils/avrcp_*_utils) - avrcp_cover_art_utils:cover art 服务封装(JPEG 接收/解码/显示), 依赖 esp_jpeg 组件(idf.py add-dependency 拉取) ## Kconfig - Kconfig.in 新增 BT_AVRCP_ENABLED(dummy,随 A2DP 启用)+ 'AVRCP Features' 菜单 + BT_AVRCP_CT_COVER_ART_ENABLED(默认 y), 例程 sdkconfig.defaults 依赖此配置项 ## 已知差异(README 已注明) - 例程 A2DP 流部分依赖 v6.1.0 组件架构(esp_driver_i2s/dac), v5.1.4 无此拆分,完整编译需按 v5.1.4 a2dp_sink 例程适配 - cover art 核心逻辑独立于 A2DP 流,可复用;显示层需适配实际屏幕
…OBEX ## 问题 1:配对/连接即崩溃(LoadProhibited,EXCVADDR=0x8) - 崩溃点:OBEX_CreateConn(obex_api.c:138) ← GOEPC_Open ← bta_av_ca_api_open - 根因:OBEX/GOEPC 的传输层 ops(obex_cb.tl_ops[])未初始化—— v6.1.0 在 bte_init.c 的 BTA 模块初始化前调用 OBEX_Init()/GOEPC_Init() (填充 tl_ops 并 init L2CAP/RFCOMM 传输层),移植时遗漏该接线, tl_ops 全 NULL → OBEX_CreateConn 解引用 NULL 崩溃 - 修复:bte_init.c 补 OBEX_Init()/GOEPC_Init()(MCA_Init 之后、BTA Modules 之前), 错误清理路径补 GOEPC_Deinit()/OBEX_Deinit(),并补对应 includes - 实测:配对/连接不再崩溃 ## 问题 2:Cover Art 连接 ESP_OK 但手机不返回封面(0x80 属性) - 现象:OBEX 连接建立但无 COVER_ART_STATE_EVT(OBEX 握手未完成), 手机(小米14,支持 AVRCP 1.6 Cover Art)不返回 image handle - 根因分析:v6.1.0 的 goepc_main.c 较 v5.5.2 新增 pkt 释放逻辑 (free_pkt/has_pkt 机制,51 行差异)——该改动未经实机验证, 可能提前释放 OBEX 数据包破坏握手;用户旧项目用 v5.5.2 验证 coverart 正常 - 修复:GOEP/OBEX 核心文件切换到 v5.5.2 验证版: goepc_main.c / obex_api.c / obex_api.h(含配套 ca_act.c 的 OBEX_GetHeaderLength 单参数签名适配) - 实测:设备稳定运行,Cover Art 流程待手机连接后验证 ## 应用层调整(项目仓库另行提交) - Cover Art 元数据请求改为单独请求 0x80 属性(不与 TITLE/ARTIST 混发, 小米手机对混合请求不返回 handle;v6.1.0 例程 ca_req 同款做法) - REMOTE_FEATURES_EVT 检测 TG_COVER_ART 时发起 OBEX 连接(例程流程) - COVER_ART_STATE_EVT 走 BtAppTask 队列(on_state 内部发元数据请求需任务上下文)
## 问题:Cover Art 连接 ESP_OK 但手机不返回封面(0x80 属性) ### 根因 1:SDP 查询缺 ADDITION_PROTO_DESC_LISTS 属性 - bta_av_rc_disc 的 attr_list 增加了 ATTR_ID_ADDITION_PROTO_DESC_LISTS (OBEX PSM 所在属性),但 db_params.num_attr 未同步(仍为 3) - SDP 只查询前 3 个属性,OBEX PSM 从未获取 → svr.l2cap.psm = 0 → L2CAP 连接 PSM 0 无效 → OBEX 握手失败 - 修复:num_attr 3→4(与 v5.5.2 一致) - 实测:bta_av_ca_api_open psm:0x1005(手机 OBEX PSM 正确解析) ### 根因 2:BTA→BTC 的 CA 事件未路由 - v5.5.2 的 btc_av.c CHECK_RC_EVENT 宏和 btc_av_hdl_event 包含 BTA_AV_CA_STATUS_EVT / BTA_AV_CA_DATA_EVT → btc_rc_handler - v5.1.4 移植时遗漏 → CA 事件被 A2DP handler 丢弃, btc_rc_cb.rc_cover_art_connected 永不更新,COVER_ART_STATE_EVT 不到应用层 - 修复:两处补 BTA_AV_CA_STATUS_EVT/BTA_AV_CA_DATA_EVT case - 实测:Cover Art connected (reason 0x0) 到达应用层 ### 根因 3:SDP 重连路径不触发 REMOTE_FEATURES(应用层兜底另行处理) - bta_av_rc_disc/bta_av_rc_disc_done/bta_av_ca_api_open 增加 ESP_LOGE 调试日志(BT_SDP_DBG/BT_CA_DBG 标签),便于实机定位 ## 验证(小米14 实机) - 全链路日志:SDP 能力检测(categories 0x111 含 COVER_ART) → OBEX PSM 0x1005 → GOEPC_Open ESP_OK → OBEX_CONNECT_EVT → OBEX_DATA_EVT(CONNECT 响应)→ Cover Art connected → 元数据 0x80(image handle)→ 请求缩略图 → JPEG 36642 字节 → 解码 200x200 → Cover art ready (v1)
## 背景
- 例程从 v6.1.0 原样移植,依赖 v6.1.0 特有组件/API,v5.1.4 无法编译
- 期间框架层修复了 Cover Art 全链路(OBEX 初始化/SDP/事件路由),
例程需要同步适配才能在 v5.1.4 编译运行
## 例程适配(v5.1.4 编译通过,avrcp_ct_cover_art.bin 847KB)
- 默认禁用 A2DP 音频流(CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE=n):
a2dp_sink_int/ext_codec_utils 依赖 v6.1.0 组件拆分(esp_driver_i2s/dac),
v5.1.4 无;Cover Art 核心不依赖音频输出
- idf_component.yml 移除 a2dp_sink_int/ext_codec_utils 依赖
- 移除 v6.1.0 特有 API(v5.1.4 无):
- bredr_app_common_utils:esp_bt_dev_cb_event_t(device 回调)、
esp_bluedroid_init_with_cfg→esp_bluedroid_init、auth_cmpl.lk_type、
ESP_BT_GAP_ENC_CHG_EVT、mode_chg.interval
- a2dp_sink_common_utils:ESP_A2D_SEP_REG_STATE_EVT
- avrcp_common_utils:ESP_AVRC_CT/TG_PROF_STATE_EVT
- avrcp_metadata_service:补 #include <string.h>
- bt_app_av.h:移除 esp_a2d_audio_data_cb(v6.1.0 类型)
- main.c:esp_bt_gap_set_device_name→esp_bt_dev_set_device_name
- avrcp_cover_art_utils CMakeLists:加 driver 依赖(v5.1.4 SPI 在 driver 组件)
- README 补充 v5.1.4 适配说明
## 框架修复
- obex_int.h:OBEX_TL_L2CAP_BT_HDR_OFFSET_MIN → OBEX_TL_L2CAP_BT_HDR_MIN_OFFSET
(宏引用名与 obex_tl_l2cap.h 定义不一致,v6.1.0/v5.5.2 自身遗留 bug,
项目编译未触发因该宏未被实际使用路径引用;例程编译暴露)
## 背景 - 上次适配时因误判 v5.1.4 无新 I2S API(driver/i2s_std.h),禁用了 A2DP 音频流 - 实际 v5.1.4 driver 组件自带 i2s_std.h(components/driver/i2s/include/driver/), 原始 a2dp_sink 例程一直用新 I2S API 编译运行 ## 适配(v5.1.4 原始 a2dp_sink 音频流) - bt_app_core_utils:内置 ringbuffer + I2S 任务 (write_ringbuf/bt_i2s_task_start_up/shut_down,移植自原始 a2dp_sink bt_app_core.c) - CMakeLists 加 esp_ringbuf/driver 依赖(v5.1.4 组件归属) - 补 freertos/semphr.h include - bt_app_av.c: - 音频数据回调 bt_app_a2d_data_cb → write_ringbuf(原始实现) - 内置 bt_i2s_driver_install/uninstall(固定引脚 26/22/25) - A2DP 事件处理器 bt_av_hdl_a2d_evt(含 I2S 启停,原始 a2dp_sink 逻辑) - ESP_A2D_AUDIO_CFG_EVT 用 a2d->audio_cfg.mcc.type(v5.1.4 结构) - 移除 a2dp_sink_int/ext_codec_utils include 和 a2dp_sink_common_utils 依赖 - Kconfig.projbuild:补 EXAMPLE_I2S_BCK/LRCK/DATA_PIN(原始 a2dp_sink 默认值), USE_EXTERNAL_CODEC 默认改 n(用内部解码 + write_ringbuf) - main/CMakeLists.txt:移除 EXTRA_COMPONENTS(v6.1.0 组件),加 driver 依赖 - sdkconfig.defaults:移除禁用音频流的配置 ## 验证 - v5.1.4 编译通过(avrcp_ct_cover_art.bin 868KB,含 A2DP 音频流) - Cover Art + 音频输出均可用(沿用项目实机验证的框架层修复)
…OPUS/LC3Plus)
## 背景
- v5.1.4 框架蓝牙组件经 cfint/sprlightning 大规模修改,已移植 AOSP 多 codec
解码框架(esp_a2d_sink_init 自动注册所有启用 codec 的 SEP)
- 原始 a2dp_sink 例程仅支持 SBC,未体现框架多 codec 能力
- 参照 v6.1.0 的 a2dp_sink_stream 命名风格,创建带 ext 字符的例程
## 实现
- 基于 v5.1.4 原始 a2dp_sink 例程增强:
- main/codec_config/(移植自 cfint 多 codec 项目 codec_config 组件,
Apache-2.0/AOSP 来源):解析 ESP_A2D_AUDIO_CFG_EVT 的 mcc,
支持 9 种 codec 的采样率/位深/声道(含 LDAC/LHDC 96kHz/32bit)
- bt_app_av.c:AUDIO_CFG 事件用 codec_config 配置 I2S(原始仅 SBC 16-bit)
- partitions.csv:16MB 自定义分区(多 codec 固件 ~1.97MB)
- sdkconfig.defaults:启用全部 codec 开关(SBC/AAC/aptX/LDAC/OPUS/LC3Plus/LHDCV5)
+ 16MB flash + custom 分区
- Kconfig.projbuild:I2S 引脚配置(26/22/25)+ 内部 DAC/外部 I2S 输出选择
## 验证
- v5.1.4 编译通过(a2dp_sink_stream_ext.bin 1.97MB)
- 固件含全部多 codec 符号(aptX/aptX-HD/Opus/LDAC/LHDC 等,nm 确认)
- 运行时根据手机实际协商的 codec 自动配置 I2S(日志显示 codec/采样率/位深)
## 注意
- 未引入项目 a2dp_sink_cfint_idf514 的无关内容(仅移植 codec_config 组件)
- codec_config 版权保留 Apache-2.0(AOSP 来源,MLX 更新)
…default to 96k/24.
- workspace is now just the decoder struct (lhdc_dec_get_workspace_size returns sizeof(struct)); zero it after malloc so first init has no garbage tail ptrs - cleanup calls lhdc_dec_deinit() to free the decoder's individually-allocated rate-sized work buffers before freeing the workspace - pins LHDC-V5-Decoder submodule to d52104f (split-workspace)
修正了非错误的DEBUG日志打印
…R 调用,前者不适用于 bta_av_act.c/bta_av_ca_act.c,现在 everything works OK.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixed AVRCP abs Volume Control:
Sink can 100% follow source's volume change.
Add Support for LHDC V5
Add WillyBilly06's LHDC-V5-Decoder, it works much more better than the ldac decoder.
Embed all Useable A2DP Audio Codecs
User just need to git clone this repository and init submodule.
Add PSRAM Allocation
If enable, it will auto alocation from the PSRAM, else will use the SRAM(large than before). Bt buffer overflow was solved because of this.